import { defineStore } from 'pinia'
import { resetRouter } from '@/routers'
import { loginApi, logoutApi } from '@/api/auth'
import { getUserInfoApi } from '@/api/user'

export const useUserStore = defineStore({
  // id: 必须的，在所有 Store 中唯一
  id: 'userState',
  // state: 返回对象的函数
  state: () => ({
    // 登录token
    token: null,
    // 登录用户信息
    userInfo: {},
    // 角色
    roles: localStorage.roles ? JSON.parse(localStorage.roles) : [],
  }),
  getters: {},
  // 可以同步 也可以异步l
  actions: {
    // 登录
    login(userInfo) {
      const { username, password } = userInfo
      return new Promise(async (resolve, reject) => {
        loginApi(userInfo)
          .then(async (response) => {
            const { tokenType, accessToken } = response.data
            this.token = tokenType + ' ' + accessToken // Bearer eyJhbGciOiJIUzI1NiJ9.xxx.xxx
            this.userInfo = userInfo
            await this.getRoles()
            resolve(username)
          })
          .catch((error) => {
            reject(error)
          })
      })
    },
    // 获取用户授权角色信息，实际应用中 可以通过token通过请求接口在这里获取用户信息
    getRoles() {
      return new Promise((resolve, reject) => {
        // 获取权限列表 默认就是超级管理员，因为没有进行接口请求 写死
        this.roles = ['other']
        localStorage.roles = JSON.stringify(this.roles)
        resolve(this.roles)
      })
    },
    // 获取用户信息 ，如实际应用中 可以通过token通过请求接口在这里获取用户信息
    getInfo(roles) {
      return new Promise((resolve, reject) => {
        getUserInfoApi()
          .then(({ data }) => {
            if (!data) {
              reject('Verification failed, please Login again.')
              return
            }
            if (!data.roles || data.roles.length <= 0) {
              reject('getUserInfo: roles must be a non-null array!')
              return
            }
            Object.assign(user, { ...data })
            resolve(data)
          })
          .catch((error) => {
            reject(error)
          })

        this.roles = roles
        resolve(roles)
      })
    },
    // 退出
    logout() {
      return new Promise((resolve, reject) => {
        logoutApi()
          .then(() => {
            this.token = null
            this.userInfo = {}
            this.roles = []
            location.reload() // 清空路由
            resolve(null)
          })
          .catch((error) => {
            reject(error)
          })
      })
    },
    // remove token
    resetToken() {
      return new Promise((resolve) => {
        this.token = null
        resetRouter()
        resolve(null)
      })
    },
  },
  // 进行持久化存储
  persist: {
    // 本地存储的名称
    key: 'userState',
    //保存的位置
    storage: window.localStorage, //localstorage
  },
})
